Los principales objetivos de este ejercicio fueron crear rutinas para tres nuevas interrupciones,
la de reloj, la de teclado, y la \texttt{0x45}.
\\
\hspace*{10pt}
Para atender estas tres interrupciones se agregaron las entradas 32 (Reloj), 33 (Teclado) y 69(interrupci\'on 0x45) en
la inicializaci\'on de la IDT. Al igual que las interrupciones anteriores, para las entradas 32 y 33 usan el selector
de segmento \texttt{0x0050} (C\'odigo de nivel 0, \{index: A $|$ gdt: 0 $|$ rpl: 00\}) y los atributos
\texttt{0x8E00} (\{P: 1 $|$ DPL: 00 $|$ 01110 (D=1) $|$ 000 00000\}). Sin embargo, para la interrupci\'on 0x45 debemos cargarla con otros
atributos (\{P:1$|$ DPL: 11$|$ 01110 (D=1)$|$ 000 00000\}) = 1110 1110 0000 0000 = 0xEE00 donde se setean el DPL para que tenga nivel 3.
El selector de segmento para la 0x45 sigue siendo igual a la dem\'as \texttt{0x0050}.


\subsubsection{Interrupci\'on de Reloj}
En el archivo {\bf isr.asm} agregamos una rutina para atender la interrupci\'on 32. Esta comienza
deshabilitando las interrupciones y pusheando los principales registros para preservarlos. Luego
comunicamos a la PIC que que ya se atendi\'o la interrupci\'on llamando al m\'etodo
\texttt{fin\_intr\_pic1}. Gracias al m\'etodo \texttt{proximo\_reloj} provisto por la catedra
imprimos en pantalla el avance del reloj, para despu\'es restaurar los registros y habilitar de
nuevo las interrupciones. Terminamos retornando de la interrupci\'on gracias a la instrucci\'on
\texttt{iret}.


\subsubsection{Interrupci\'on de Teclado}
La rutina de interrupci\'on de teclado es casi identica a la de reloj. La \'unica diferencia es que
en lugar de llamar a \texttt{proximo\_reloj} llamamos al m\'etodo \texttt{numeroTeclado}.
\\
\hspace*{10pt}
Este lee a trav\'es del puerto \texttt{0x60} el \emph{scan code} del teclado. Gracias a un
\texttt{test al, 0x80} podemos determinar si se trata de un \emph{make code} o un \emph{break code}.
En este \'ultimo caso, procedemos a limpiar la pantalla imprimiendo un cuadro negro en la esquina
superior derecha.
\\
\hspace*{10pt}
En el primer caso, evaluamos si la tecla presionada corresponde a un n\'umero del teclado y en ese caso
procedemos a imprimir el n\'umero correspondiente en la esquina superior derecha de la pantalla. En caso
contrario, no hacemos nada y simplemente salimos de la interrupci\'on.


\subsubsection{Interrupci\'on \texttt{0x45}}
La rutina de interrupci\'on en este caso es escencialmente igual a la de reloj, salvo que en vez de
llamar a \texttt{proximo\_reloj} simplemente seteamos el valor 42 en el registro {\bf eax}, tal como
lo solicita la consigna.


\subsubsection{Kernel}
Es necesario remapear la PIC para que las interrupciones que genere no se choquen con las de la CPU.
Por lo tanto, desde el Kernel llamamos a \texttt{deshabilitar\_pic}, \texttt{resetear\_pic} y
\texttt{habilitar\_pic} para realizar este mapeo.
\\
\hspace*{10pt}
Luego, ejecutamos la instrucci\'on \texttt{sti} para habilitar las interrupciones y poder as\'i ver
el reloj (abajo a la derecha) y los n\'umeros del teclado en pantalla (arriba a la derecha), como se puede apreciar a continuaci\'on.

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.5]{Images/ej5.png}
	\centering
	\label{fig_ej5}
\end{figure}
